package cn.s1995.sloth.common.core.util;


import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

/**
 * HttpUtil
 *
 * @Author penf
 * @Description
 * @Date 2020/04/03 01:41
 */
@Slf4j
@UtilityClass
public class HttpUtil {


    public static void main(String[] args) {

    }


    /**
     * GET请求调用方式
     *
     * @param url          请求URL
     * @param responseType 返回对象类型
     * @return ResponseEntity 响应对象封装类
     */
    public static <T> T get(String url, Class<T> responseType) {
        return get(url, null, responseType);
    }

    /**
     * GET请求调用方式
     *
     * @param url          请求URL
     * @param params
     * @param responseType 返回对象类型
     * @return
     */
    public static <T> T get(String url, Map<String, Object> params, Class<T> responseType) {
        HttpResponse response = HttpRequest.get(url)
                .form(params)
                .execute();
        if (!isOK(response)) {
          return null;
        }
        return JSONUtil.toBean(response.body(), responseType);
    }

    /**
     * POST请求调用方式
     *
     * @param url          请求URL
     * @param responseType 返回对象类型
     * @return
     */
    public static <T> T post(String url, Class<T> responseType) {
        return post(url, null, null, responseType);
    }

    /**
     * POST请求调用方式
     *
     * @param url          请求URL
     * @param requestBody  请求参数体
     * @param responseType 返回对象类型
     * @return ResponseEntity 响应对象封装类
     */
    public static <T> T post(String url, Object requestBody, Class<T> responseType) {
        return post(url, null, requestBody, responseType);
    }

    /**
     * POST请求调用方式
     *
     * @param url          请求URL
     * @param requestBody  请求参数体
     * @param responseType 返回对象类型
     * @return ResponseEntity 响应对象封装类
     */
    public static <T> T post(String url, Map<String, List<String>> headers, Object requestBody, Class<T> responseType) {
        HttpResponse response = HttpRequest.post(url)
                .header(headers)
                .body(JSONUtil.toJsonStr(requestBody))
                .execute();
        if (!isOK(response)) {
            return null;
        }
        return JSONUtil.toBean(response.body(), responseType);
    }


    /**
     * PUT请求调用方式
     *
     * @param url          请求URL
     * @param responseType 返回对象类型
     * @return
     */
    public static <T> T put(String url, Class<T> responseType) {
        return put(url, null, responseType);
    }


    /**
     * PUT请求调用方式
     *
     * @param url          请求URL
     * @param requestBody  请求参数体
     * @param responseType 返回对象类型
     * @return ResponseEntity 响应对象封装类
     */
    public static <T> T put(String url, Object requestBody, Class<T> responseType) {
        HttpResponse response = HttpRequest.put(url)
                .body(JSONUtil.toJsonStr(requestBody))
                .execute();

        if (!isOK(response)) {
            return null;
        }
        return JSONUtil.toBean(response.body(), responseType);
    }


    /**
     * DELETE请求调用方式
     *
     * @param url          请求URL
     * @param responseType 返回对象类型
     * @return ResponseEntity 响应对象封装类
     */
    public static <T> T delete(String url, Class<T> responseType) {
        return delete(url, null, responseType);
    }

    /**
     * DELETE请求调用方式
     *
     * @param url          请求URL
     * @param params       请求参数
     * @param responseType 返回对象类型
     * @return
     */
    public static <T> T delete(String url, Map<String, Object> params, Class<T> responseType) {
        HttpResponse response = HttpRequest.delete(url)
                .form(params)
                .execute();

        if (!isOK(response)) {
            return null;
        }
        return JSONUtil.toBean(response.body(), responseType);
    }


    /**
     * 是否请求成功
     * @param response
     * @return
     */
    public static boolean isOK(HttpResponse response) {
        return HttpStatus.HTTP_OK == response.getStatus();
    }
}
